﻿using CodeGenerator.Dtos;
using Newtonsoft.Json;
using System.Data;
using System.Reflection;

namespace CodeGenerator.Facade
{
    public class OtherFacade
    {
        /// <summary>
        /// 解析connectionConfig  文件
        /// </summary>
        /// <returns></returns>
        public async Task<List<ConnectionConfigDTO>> AnalysisConnectionConfigAsync()
        {
            var content = await File.ReadAllTextAsync(@$"{AppDomain.CurrentDomain.BaseDirectory}\connectionConfig.json");

            var datas = JsonConvert.DeserializeObject<List<ConnectionConfigDTO>>(content);

            return datas;
        }

        public async Task<bool> AddConnectionConfigAsync(ConnectionConfigDTO dto)
        {
            var datas = await AnalysisConnectionConfigAsync();

            var exist = datas.Where(r => r.ServerIp == dto.ServerIp).Any();
            if (exist)
            {
                return true;
            }

            datas.Add(dto);
            var jsonContent = JsonConvert.SerializeObject(datas);
            await File.WriteAllTextAsync(@$"{AppDomain.CurrentDomain.BaseDirectory}\connectionConfig.json", jsonContent);
            return true;
        }


        public static List<T> TableToListModel<T>(DataTable dt) where T : new()
        {
            // 定义集合    
            List<T> ts = new List<T>();

            // 获得此模型的类型   
            Type type = typeof(T);
            string tempName = "";

            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                // 获得此模型的公共属性      
                PropertyInfo[] propertys = t.GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;  // 检查DataTable是否包含此列    

                    if (dt.Columns.Contains(tempName))
                    {
                        // 判断此属性是否有Setter      
                        if (!pi.CanWrite) continue;

                        object value = dr[tempName];
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
                ts.Add(t);
            }
            return ts;
        }

    }
}
